package DAO;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import to.Funcionario;
import to.Lancamento;
import to.Pessoa;
import to.Pessoa;
import to.Resultado;
import to.SolicitacaoDeAnalise;
import to.Usuario;
import util.HibernateUtil;

public class PessoaDAO implements Serializable {

	public Pessoa buscarSalvar(Pessoa pessoaPesquisar) throws Exception {
		Pessoa pessoa = new Pessoa();
		Session session = null;
		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);
			criteria.add(Restrictions.idEq(pessoaPesquisar.getCodigo()));
			pessoa = (Pessoa) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return pessoa;
	}

	public Pessoa pesquisarCPF(String cpf) throws Exception {
		Pessoa retorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);
			criteria.add(Restrictions.eq("cpf_cnpj", cpf));
			criteria.setMaxResults(1);
			retorno = (Pessoa) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return retorno;
	}

	public List<Pessoa> pessoaPesquisar(Pessoa pessoa) throws Exception {
		List<Pessoa> retorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);

			if (pessoa.getTipoPessoa() != null) {

				criteria.add(Restrictions.eq("tipoPessoa",
						pessoa.getTipoPessoa()));

			} else if (!(pessoa.getCodigo() == 0)) {

				criteria.add(Restrictions.eq("codigo", pessoa.getCodigo()));

			} else if (!pessoa.getCpf_cnpj().isEmpty()
					|| pessoa.getCpf_cnpj() != null) {

				criteria.add(Restrictions.ilike("cpf_cnpj",
						pessoa.getCpf_cnpj()));

			} else if (pessoa.getDataNascimento() != null) {

				criteria.add(Restrictions.eq("dataNascimento",
						pessoa.getDataNascimento()));
			} else if (!pessoa.getEmail().isEmpty()
					|| pessoa.getEmail() != null) {

				criteria.add(Restrictions.ilike("email", pessoa.getEmail()));

			} else if (!pessoa.getNome().isEmpty() || pessoa.getNome() != null) {

				criteria.add(Restrictions.ilike("nome", pessoa.getNome()));

			}
			if (!pessoa.getTelefone().isEmpty() || pessoa.getTelefone() != null) {

				criteria.add(Restrictions.ilike("telefone",
						pessoa.getTelefone()));
			}
			criteria.addOrder(Order.desc("nome"));
			retorno = (List<Pessoa>) criteria.list();
			if (!retorno.isEmpty()) {
				System.out.println("Lista Pessoa Vazia, PessoaDAO");
			}
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return retorno;
	}

	public List<Pessoa> buscaTodos() throws Exception {
		List<Pessoa> listaRetorno = null;
		try {
			Session session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class);

			criteria.addOrder(Order.asc("nome"));
			listaRetorno = (List<Pessoa>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}

	public Pessoa pesquisarUsuarioPessoa(Usuario user) throws Exception {
		Pessoa pessoa = null;
		Session session = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Pessoa.class, "pess")
					.createAlias("pess.usuario", "usu");
			criteria.add(Restrictions.like("pess.usuario", user));
			pessoa = (Pessoa) criteria.uniqueResult();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			session.close();
		}
		return pessoa;
	}

	public List<SolicitacaoDeAnalise> buscarSolicitacaoPessoa(Pessoa pessoa)
			throws Exception {
		Session session = null;
		List<SolicitacaoDeAnalise> listaRetorno = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(SolicitacaoDeAnalise.class);
			criteria.add(Restrictions.eq("pessoa", pessoa));
			criteria.addOrder(Order.asc("status"));
			listaRetorno = (List<SolicitacaoDeAnalise>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return listaRetorno;
	}

	public ArrayList<Lancamento> buscarTodosPorPessoa(Pessoa pessoa)
			throws Exception {
		ArrayList<Lancamento> retornaLancamento = new ArrayList<Lancamento>();
		Session session = null;
		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(Lancamento.class, "lanca")
					.createAlias("lanca.solicitacao", "solici")
					.createAlias("solici.pessoa", "pesso");
			criteria.add(Restrictions.eq("pesso.codigo", pessoa.getCodigo()));
			criteria.addOrder(Order.desc("lanca.dataEmissao"));
			criteria.addOrder(Order.desc("lanca.dataPagamento"));
			retornaLancamento = (ArrayList<Lancamento>) criteria.list();
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} finally {
			session.close();
		}
		return retornaLancamento;
	}

}
